// 引入 Axios
import axios from 'axios';

import {
    generateSM4Key,
    base64Encode,
    base64Decode,
    sm4Encrypt,
    sm4Decrypt,
    sm2Decrypt,
    sm2Encrypt
} from '@/utils/cryptoUtils';

const headerFlag = 'encrypt-key'
const publicKey = '04ed9dacb9e527573305857ce73088bbe44b034050b105c36edbfa35178153c6782dc24b4d173938fb237a58a1af7eb25df84bf6fffa93c765d528e59bbbfc078e'
const privateKey = 'ed3e455c75fb3ed43673ee66af27f1d7612f5bd228f4891bfb88c7e138c56613'
// 创建 Axios 实例
const instance = axios.create({
    baseURL: 'http://localhost:18919', // 设置基础 URL
    timeout: 10000, // 设置请求超时时间
});

// 请求拦截器
instance.interceptors.request.use(
    (config) => {
        // 请求要加密 直接加密整个body
        const isEncrypt = config.headers['isEncrypt'];
        if (isEncrypt){
            // sm4 加密密码
            const sm4Key = generateSM4Key();
            // 使用 sm2 公钥加密 sm4 的密码 并放入 encrypt-key 请求头
            config.headers['encrypt-key'] = sm2Encrypt(base64Encode(sm4Key), publicKey);
            console.log(sm4Key)
            // 使用 sm4 加密数据
            config.data = sm4Encrypt(JSON.stringify(config.data), sm4Key)
            // 设置 Content-Type 为 text/plain
            config.headers['Content-Type'] = 'text/plain';
        }
        // 返回处理后的配置
        return config;
    },
    (error) => {
        // 对请求错误做些什么
        return Promise.reject(error);
    }
);

// 响应拦截器
instance.interceptors.response.use(
    (response) => {
        // 对响应数据做些什么
        // 例如，可以在这里处理通用的响应逻辑
        if (response.status === 200) {
            return response.data;
        } else {
            return Promise.reject(response);
        }
    },
    (error) => {
        // 对响应错误做些什么
        // 例如，可以在这里处理通用的错误逻辑
        if (error.response) {
            switch (error.response.status) {
                case 401:
                    // 处理未授权的情况
                    console.error('未授权，请重新登录');
                    break;
                case 404:
                    // 处理资源未找到的情况
                    console.error('请求的资源未找到');
                    break;
                case 500:
                    // 处理服务器错误的情况
                    console.error('服务器内部错误');
                    break;
                default:
                    console.error('请求失败', error.response.status);
            }
        } else {
            console.error('请求失败', error.message);
        }

        // 返回错误信息
        return Promise.reject(error);
    }
);

// 导出 Axios 实例
export default instance;